git 이전 브랜치 이름을 가져오는 방법들

git 이전 브랜치 이름을 가져오는 방법들

Clock Icon2024.08.13

Git을 사용하면서 여러 브랜치를 왔다갔다하는 경우에 터미널의 자동완성 혹은 GUI를 쓰는 방법도 있지만, 더 간단하게 할 수 없을까요?

브랜치 뒤로가기

어떻게 하면 이전 브랜치로 이동할 수 있을까요? 가장 기본적인 방법은 checkout 일겁니다.

git checkout {branch_name} 최근에는 switch 라는 브랜치를 이동하기 위한 커맨드도 있으니 git switch {branch_name} 을 사용할 수도 있겠네요.

하나의 브랜치로 작업하는 경우 main/dev 등의 외우기 쉬운 부모 브랜치명만 기억하면 되므로 문제가 없습니다.

그런데 여러개의 브랜치를 사용하는 경우 작업중인 브랜치들의 이름을 기억하는건 쉽지 않더라구요.

특히 여러 브랜치를 사용하는 경우 git switch -c {branch_name} 형식으로 새로운 브랜치는 만들면 그만이라 문제가 없지만, 이전 브랜치를 찾으려면 "내가 어느 브랜치에서 작업하다 온거지?" 라는 생각을 해야하고, 실수로 브랜치를 엉뚱하게 이동하는 문제도 발생했습니다...

물론 git log로 이전 브랜치를 볼 수도 있겠지만 간단한 방법을 통해 이전 브랜치로 이동해 봅시다.

git switch -

git은 편의를 위해 특수문자들에 기능을 제공합니다. 이번에 얻고 싶은, 이전 브랜치명은 - 을 사용하면 됩니다.

따라서 git switch - 은 이전 브랜치로 이동하는 커맨드가 됩니다..! - 도 사실 기존 편의를 위한 특수문자를 래핑한 것으로 @{-1} 의 줄임말입니다.

https://git-scm.com/docs/git-switch#Documentation/git-switch.txt-ltstart-pointgt

@ 그럼 얘는 무엇일까요, @ 는 사실 head 입니다. 우리가 사용한 @{-1} 은 헤드의 1번째 이전의 브랜치 의미가 되서 이전 브랜치로 이동할 수 있게 되는 겁니다. (@{1} 은 reflog 기준으로 이동하는 용도입니다.)

만약 쉘이나 .gitconfig에 alias로 조금 더 줄이면 엄청나게 빠르게 브랜치를 앞뒤로 이동할 수 있게됩니다..!

# .zshrc
alias g='git'

# .gitconfig
[alias]
  sw = switch

이런식으로 설정하면 g sw - 으로 브랜치를 왔다갔다 머리속의 컨텍스트에 저장할 필요없이 사용가능해지게 되버립니다..!


g sw - 에서 이동하는 이전 브랜치는 해당 브랜치의 부모 브랜치를 의미하지 않습니다! a -> b -> c의 브랜치 구성에서 a 에서 c로 이동했다면 c 브랜치에서의 g sw -b가 아니라 a 이므로 주의해야합니다!


개인적으로 하나의 작업을 여러 브랜치로 나누는 걸 선호하는 편이라 이걸 알고나서 매우 삶이 윤택해졌습니다.

하지만, 현실에서는 다른 문제가 생겼는데...

gh pr create

로컬에서 git만 사용하다면 g sw - 커맨드로 족했습니다. 하지만, GitHub에 여러개의 작업된 브랜치들을 PR로 만들어야합니다. Graphite 같은 툴로 쉽게 만들 수도 있지만, GitHub의 CLI로 직접하려면 어떻게 해야할까요?

GitHub은 CLI로 PR을 만들 수 있는 기능을 제공합니다. gh pr create --web 을 PR 만들고 싶은 브랜치에서 입력하면 GitHub의 웹 콘솔로 이동합니다..!

편한 기능이라 자주 사용하고 있지만 PR 작성시에 베이스 브랜치에서 문제가 생기게 됩니다.

만약 브랜치 a -> b -> c 순으로 작업을 했다고 치면, amain 같이 원래 사용하는 베이스 브랜치여서 문제가 없지만, b에서는 베이스 브랜치를 a로 두어야 PR에서 파일에 변경점이 ab 브랜치 사이에 것들만 보이기 때문에 설정이 필요합니다.

또한 웹 콘솔에서 베이스 브랜치를 설정하면, c에서 작업한 경우 a를 베이스 브랜치로 설정한다던지 실수할 가능성도 있기에 자동으로 CLI 상에서 설정하고 싶게 됩니다.

그러면 이전의 -을 이용해서 이전 브랜치명을 사용할 수 있을까요?

❯ gh pr create -B -

Creating pull request for c into - in tolluset/config

-B 는 베이스 브랜치를 설정하는 옵션입니다. -를 사용하게되면 이전 브랜치가 아니라 - 자체 베이스 브랜치로 설정됩니다...

그러면 어떻게 해야할까요? 사실 git은 이런 경우들을 위해 여러가지 기능들을 제공하고 있습니다. 그 중에 물론 이전 브랜치명을 가져오는 방법도 있습니다.

git rev-parse --abbrev-ref @{-1} 이라는 커맨드는 이전 브랜치의 이름을 가져옵니다.

rev-parse: git의 여러가지 정보들을 가져오는 커맨드
--abbrev-ref: 가져오려는 정보를 심플하게 줄여주는 옵션
@{-1}: 이전 브랜치

위와 같은 조합으로 이전 브랜치의 이름을 가져올 수 있습니다.

❯ git rev-parse --abbrev-ref @{-1}
b

그러면 우리는 위의 커맨드를 이용해서 GitHub CLI로 PR을 만들기 전에 베이스 브랜치를 설정해주면 됩니다. 아래처럼요.

# .zshrc
alias gb='BASE=$(git rev-parse --abbrev-ref @{-1})'
alias ghpc='gb;gh pr create --web -a @me -B $BASE'

앞으로 ghpc 를 입력하게 되면 이전 브랜치를 기준으로 PR을 만들 수 있게 됩니다! (-a @me는 자기자신을 어사인 시킵니다. 꿀입니다.)

마무리

하지만... 이전 브랜치 이름은 부모 브랜치의 이름과 다를 수 있습니다. 제가 염려했던 베이스 브랜치 실수 문제는 여전히 발생할 수 있습니다.

현재까지는 거의 발생하지 않고 있고 만일에 대비해 한번씩 더 확인을 하고 있기는 합니다.

이전 브랜치명은 쉽게 가져올 수 있지만, 부모 브랜치는 약간의 고생이 첨가되어야하기 때문에 저는 이전 브랜치명으로 타협을 보았습니다. 작업시에 하나의 브랜치 만들고 PR 만들고 이런식이 되다보니 크게 문제가 없더라구요.

GitHub CLI에서 이전 부모 브랜치를 베이스 브랜치로 설정할 수 있는 옵션은 현재 없기 때문에 이렇게 사용하고 있지만, 추가가 되면 좀 더 편하게 사용할 수도 있겠네요. (컨트리뷰트 기회가 이렇게 또..)

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.